welo git mirrors
RNS/Utilities/rnpath.py 0.4.5 (964e3e10) Text, 12.58 KB
T8b949e#!/usr/bin/env python3
T8b949e# MIT License
T8b949e#
T8b949e# Copyright (c) 2016-2022 Mark Qvist / unsigned.io
T8b949e#
T8b949e# Permission is hereby granted, free of charge, to any person obtaining a copy
T8b949e# of this software and associated documentation files (the "Software"), to deal
T8b949e# in the Software without restriction, including without limitation the rights
T8b949e# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
T8b949e# copies of the Software, and to permit persons to whom the Software is
T8b949e# furnished to do so, subject to the following conditions:
T8b949e#
T8b949e# The above copyright notice and this permission notice shall be included in all
T8b949e# copies or substantial portions of the Software.
T8b949e#
T8b949e# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
T8b949e# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
T8b949e# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
T8b949e# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
T8b949e# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
T8b949e# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
T8b949e# SOFTWARE.
Tff7b72import T7ee787RNS
Tff7b72import T7ee787sys
Tff7b72import T7ee787time
Tff7b72import T7ee787argparse
Tff7b72from T7ee787RNST7ee787.T7ee787_version Tff7b72import Te6edf3__version__
Tff7b72def Td2a8ffprogram_setupTb4b4b4(Te6edf3configdirTb4b4b4, Te6edf3tableTb4b4b4, Te6edf3ratesTb4b4b4, Te6edf3dropTb4b4b4, Te6edf3destination_hexhashTb4b4b4, Te6edf3verbosityTb4b4b4, Te6edf3timeoutTb4b4b4, Te6edf3drop_queuesTb4b4b4)Tb4b4b4:
Tff7b72if Te6edf3tableTb4b4b4:
Te6edf3destination_hash Tff7b72= Tff7b72None
Tff7b72if Te6edf3destination_hexhash Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configdirTb4b4b4, Te6edf3loglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Te6edf3table Tff7b72= Tffa657sortedTb4b4b4(Te6edf3reticulumTff7b72.Td2a8ffget_path_tableTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3eTb4b4b4: Tb4b4b4(Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffinterfaceTa5d6ff"Tb4b4b4]Tb4b4b4, Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4]Tb4b4b4) Tb4b4b4)
Te6edf3displayed Tff7b72= T79c0ff0
Tff7b72for Te6edf3path Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72== Tff7b72None Tff7b72or Te6edf3destination_hash Tff7b72== Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Te6edf3exp_str Tff7b72= Te6edf3RNSTff7b72.Td2a8fftimestamp_strTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4]Tb4b4b4)
Tff7b72if Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3m_str Tff7b72= Ta5d6ff"Ta5d6ff Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3m_str Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Tffa657printTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffhopsTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hopTa5d6ff"Tff7b72+Te6edf3m_strTff7b72+Ta5d6ff"Ta5d6ff away via Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffviaTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffinterfaceTa5d6ff"Tb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff expires Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8fftimestamp_strTb4b4b4(Te6edf3pathTb4b4b4[Ta5d6ff"Ta5d6ffexpiresTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3destination_hash Tff7b72!= Tff7b72None Tff7b72and Te6edf3displayed Tff7b72== T79c0ff0Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo path knownTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elif Te6edf3ratesTb4b4b4:
Te6edf3destination_hash Tff7b72= Tff7b72None
Tff7b72if Te6edf3destination_hexhash Tff7b72!= Tff7b72NoneTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configdirTb4b4b4, Te6edf3loglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Te6edf3table Tff7b72= Tffa657sortedTb4b4b4(Te6edf3reticulumTff7b72.Td2a8ffget_rate_tableTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3keyTff7b72=Tff7b72lambda Te6edf3eTb4b4b4: Te6edf3eTb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4] Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3tableTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo information availableTa5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3displayed Tff7b72= T79c0ff0
Tff7b72for Te6edf3entry Tff7b72in Te6edf3tableTb4b4b4:
Tff7b72if Te6edf3destination_hash Tff7b72== Tff7b72None Tff7b72or Te6edf3destination_hash Tff7b72== Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4:
Te6edf3displayed Tff7b72+Tff7b72= T79c0ff1
Tff7b72tryTb4b4b4:
Te6edf3last_str Tff7b72= Te6edf3pretty_dateTb4b4b4(Tffa657intTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fflastTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3start_ts Tff7b72= Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]
Te6edf3span Tff7b72= Tffa657maxTb4b4b4(Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4) Tff7b72- Te6edf3start_tsTb4b4b4, T79c0ff3600.0Tb4b4b4)
Te6edf3span_hours Tff7b72= Te6edf3spanTff7b72/T79c0ff3600.0
Te6edf3span_str Tff7b72= Te6edf3pretty_dateTb4b4b4(Tffa657intTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tb4b4b4)
Te6edf3hour_rate Tff7b72= Tffa657roundTb4b4b4(Tffa657lenTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6fftimestampsTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72/Te6edf3span_hoursTb4b4b4, T79c0ff3Tb4b4b4)
Tff7b72if Te6edf3hour_rateTff7b72-Tffa657intTb4b4b4(Te6edf3hour_rateTb4b4b4) Tff7b72== T79c0ff0Tb4b4b4:
Te6edf3hour_rate Tff7b72= Tffa657intTb4b4b4(Te6edf3hour_rateTb4b4b4)
Tff7b72if Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4] Tff7b72> T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4] Tff7b72== T79c0ff1Tb4b4b4:
Te6edf3s_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3s_str Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Te6edf3rv_str Tff7b72= Ta5d6ff"Ta5d6ff, Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffrate_violationsTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff active rate violationTa5d6ff"Tff7b72+Te6edf3s_str
Tff7b72elseTb4b4b4:
Te6edf3rv_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tff7b72if Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4] Tff7b72> Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4:
Te6edf3bli Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72-Tb4b4b4(Tffa657intTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffblocked_untilTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72-Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tb4b4b4)
Te6edf3bl_str Tff7b72= Ta5d6ff"Ta5d6ff, new announces allowed in Ta5d6ff"Tff7b72+Te6edf3pretty_dateTb4b4b4(Tffa657intTb4b4b4(Te6edf3bliTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3bl_str Tff7b72= Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff last heard Ta5d6ff"Tff7b72+Te6edf3last_strTff7b72+Ta5d6ff"Ta5d6ff ago, Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hour_rateTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff announces/hour in the last Ta5d6ff"Tff7b72+Te6edf3span_strTff7b72+Te6edf3rv_strTff7b72+Te6edf3bl_strTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffError while processing entry for Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3entryTb4b4b4[Ta5d6ff"Ta5d6ffhashTa5d6ff"Tb4b4b4]Tb4b4b4)Tb4b4b4)
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3destination_hash Tff7b72!= Tff7b72None Tff7b72and Te6edf3displayed Tff7b72== T79c0ff0Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffNo information availableTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elif Te6edf3drop_queuesTb4b4b4:
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configdirTb4b4b4, Te6edf3loglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6ff"Ta5d6ffDropping announce queues on all interfaces...Ta5d6ff"Tb4b4b4)
Te6edf3reticulumTff7b72.Td2a8ffdrop_announce_queuesTb4b4b4(Tb4b4b4)
Tff7b72elif Te6edf3dropTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configdirTb4b4b4, Te6edf3loglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Tff7b72if Te6edf3reticulumTff7b72.Td2a8ffdrop_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffDropped path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffUnable to drop path to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff. Does it exist?Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72elseTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3dest_len Tff7b72= Tb4b4b4(Te6edf3RNSTff7b72.Td2a8ffReticulumTff7b72.Td2a8ffTRUNCATED_HASHLENGTHTff7b72/Tff7b72/T79c0ff8Tb4b4b4)Tff7b72*T79c0ff2
Tff7b72if Tffa657lenTb4b4b4(Te6edf3destination_hexhashTb4b4b4) Tff7b72!= Te6edf3dest_lenTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffDestination length is invalid, must be Tffd700{hex}Ta5d6ff hexadecimal characters (Tffd700{byte}Ta5d6ff bytes).Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Tffa657hexTff7b72=Te6edf3dest_lenTb4b4b4, Te6edf3byteTff7b72=Te6edf3dest_lenTff7b72/Tff7b72/T79c0ff2Tb4b4b4)Tb4b4b4)
Tff7b72tryTb4b4b4:
Te6edf3destination_hash Tff7b72= Tffa657bytesTff7b72.Td2a8fffromhexTb4b4b4(Te6edf3destination_hexhashTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tff7b72raise Tf85149ValueErrorTb4b4b4(Ta5d6ff"Ta5d6ffInvalid destination entered. Check your input.Ta5d6ff"Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Tffa657printTb4b4b4(Tffa657strTb4b4b4(Te6edf3eTb4b4b4)Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Te6edf3reticulum Tff7b72= Te6edf3RNSTff7b72.Td2a8ffReticulumTb4b4b4(Te6edf3configdir Tff7b72= Te6edf3configdirTb4b4b4, Te6edf3loglevel Tff7b72= T79c0ff3Tff7b72+Te6edf3verbosityTb4b4b4)
Tff7b72if Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffrequest_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ffPath to Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff requested Ta5d6ff"Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= T79c0ff0
Te6edf3syms Tff7b72= Ta5d6ff"Ta5d6ff⢄⢂⢁⡁⡈⡐⡠Ta5d6ff"
Te6edf3limit Tff7b72= Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72+Te6edf3timeout
Tff7b72while Tff7b72not Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4) Tff7b72and Te6edf3timeTff7b72.Td2a8fftimeTb4b4b4(Tb4b4b4)Tff7b72<Te6edf3limitTb4b4b4:
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(T79c0ff0.1Tb4b4b4)
Tffa657printTb4b4b4(Tb4b4b4(Ta5d6ff"Tffea00\bTffea00\bTa5d6ff"Tff7b72+Te6edf3symsTb4b4b4[Te6edf3iTb4b4b4]Tff7b72+Ta5d6ff"Ta5d6ff Ta5d6ff"Tb4b4b4)Tb4b4b4, Te6edf3endTff7b72=Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffstdoutTff7b72.Td2a8ffflushTb4b4b4(Tb4b4b4)
Te6edf3i Tff7b72= Tb4b4b4(Te6edf3iTff7b72+T79c0ff1Tb4b4b4)Tff7b72%Tffa657lenTb4b4b4(Te6edf3symsTb4b4b4)
Tff7b72if Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhas_pathTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4:
Te6edf3hops Tff7b72= Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffhops_toTb4b4b4(Te6edf3destination_hashTb4b4b4)
Te6edf3next_hop Tff7b72= Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3reticulumTff7b72.Td2a8ffget_next_hopTb4b4b4(Te6edf3destination_hashTb4b4b4)Tb4b4b4)
Te6edf3next_hop_interface Tff7b72= Te6edf3reticulumTff7b72.Td2a8ffget_next_hop_if_nameTb4b4b4(Te6edf3destination_hashTb4b4b4)
Tff7b72if Te6edf3hops Tff7b72!= T79c0ff1Tb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ffsTa5d6ff"
Tff7b72elseTb4b4b4:
Te6edf3ms Tff7b72= Ta5d6ff"Ta5d6ff"
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ffPath found, destination Ta5d6ff"Tff7b72+Te6edf3RNSTff7b72.Td2a8ffprettyhexrepTb4b4b4(Te6edf3destination_hashTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff is Ta5d6ff"Tff7b72+Tffa657strTb4b4b4(Te6edf3hopsTb4b4b4)Tff7b72+Ta5d6ff"Ta5d6ff hopTa5d6ff"Tff7b72+Te6edf3msTff7b72+Ta5d6ff"Ta5d6ff away via Ta5d6ff"Tff7b72+Te6edf3next_hopTff7b72+Ta5d6ff"Ta5d6ff on Ta5d6ff"Tff7b72+Te6edf3next_hop_interfaceTb4b4b4)
Tff7b72elseTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Tffea00\rTa5d6ff Tffea00\rTa5d6ffPath not foundTa5d6ff"Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff1Tb4b4b4)
Tff7b72def Td2a8ffmainTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3parser Tff7b72= Te6edf3argparseTff7b72.Td2a8ffArgumentParserTb4b4b4(Te6edf3descriptionTff7b72=Ta5d6ff"Ta5d6ffReticulum Path Discovery UtilityTa5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff"Ta5d6ff--configTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffpath to alternative Reticulum config directoryTa5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Tffa657str
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff--versionTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffversionTa5d6ff"Tb4b4b4,
Te6edf3versionTff7b72=Ta5d6ff"Ta5d6ffrnpath Tffd700{version}Ta5d6ff"Tff7b72.Td2a8ffformatTb4b4b4(Te6edf3versionTff7b72=Te6edf3__version__Tb4b4b4)
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-tTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--tableTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow all known pathsTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72False
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-rTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--ratesTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffshow announce rate infoTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72False
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-dTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--dropTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffremove the path to a destinationTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72False
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-DTa5d6ff"Tb4b4b4,
Ta5d6ff"Ta5d6ff--drop-announcesTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstore_trueTa5d6ff"Tb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffdrop all queued announcesTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72False
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ff-wTa5d6ff"Tb4b4b4,
Te6edf3actionTff7b72=Ta5d6ff"Ta5d6ffstoreTa5d6ff"Tb4b4b4,
Te6edf3metavarTff7b72=Ta5d6ff"Ta5d6ffsecondsTa5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Tffa657floatTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6fftimeout before giving upTa5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Te6edf3RNSTff7b72.Td2a8ffTransportTff7b72.Td2a8ffPATH_REQUEST_TIMEOUT
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(
Ta5d6ff"Ta5d6ffdestinationTa5d6ff"Tb4b4b4,
Te6edf3nargsTff7b72=Ta5d6ff"Ta5d6ff?Ta5d6ff"Tb4b4b4,
Te6edf3defaultTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3helpTff7b72=Ta5d6ff"Ta5d6ffhexadecimal hash of the destinationTa5d6ff"Tb4b4b4,
Tffa657typeTff7b72=Tffa657str
Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffadd_argumentTb4b4b4(Ta5d6ff'Ta5d6ff-vTa5d6ff'Tb4b4b4, Ta5d6ff'Ta5d6ff--verboseTa5d6ff'Tb4b4b4, Te6edf3actionTff7b72=Ta5d6ff'Ta5d6ffcountTa5d6ff'Tb4b4b4, Te6edf3defaultTff7b72=T79c0ff0Tb4b4b4)
Te6edf3args Tff7b72= Te6edf3parserTff7b72.Td2a8ffparse_argsTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3argsTff7b72.Td2a8ffconfigTb4b4b4:
Te6edf3configarg Tff7b72= Te6edf3argsTff7b72.Td2a8ffconfig
Tff7b72elseTb4b4b4:
Te6edf3configarg Tff7b72= Tff7b72None
Tff7b72if Tff7b72not Te6edf3argsTff7b72.Td2a8ffdrop_announces Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8fftable Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffrates Tff7b72and Tff7b72not Te6edf3argsTff7b72.Td2a8ffdestinationTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3parserTff7b72.Td2a8ffprint_helpTb4b4b4(Tb4b4b4)
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Tff7b72elseTb4b4b4:
Te6edf3program_setupTb4b4b4(
Te6edf3configdir Tff7b72= Te6edf3configargTb4b4b4,
Te6edf3table Tff7b72= Te6edf3argsTff7b72.Td2a8fftableTb4b4b4,
Te6edf3rates Tff7b72= Te6edf3argsTff7b72.Td2a8ffratesTb4b4b4,
Te6edf3drop Tff7b72= Te6edf3argsTff7b72.Td2a8ffdropTb4b4b4,
Te6edf3destination_hexhash Tff7b72= Te6edf3argsTff7b72.Td2a8ffdestinationTb4b4b4,
Te6edf3verbosity Tff7b72= Te6edf3argsTff7b72.Td2a8ffverboseTb4b4b4,
Te6edf3timeout Tff7b72= Te6edf3argsTff7b72.Td2a8ffwTb4b4b4,
Te6edf3drop_queues Tff7b72= Te6edf3argsTff7b72.Td2a8ffdrop_announcesTb4b4b4,
Tb4b4b4)
Te6edf3sysTff7b72.Td2a8ffexitTb4b4b4(T79c0ff0Tb4b4b4)
Tff7b72except Tf85149KeyboardInterruptTb4b4b4:
Tffa657printTb4b4b4(Ta5d6ff"Ta5d6ff"Tb4b4b4)
Te6edf3exitTb4b4b4(Tb4b4b4)
Tff7b72def Td2a8ffpretty_dateTb4b4b4(Te6edf3timeTff7b72=Tff7b72FalseTb4b4b4)Tb4b4b4:
Tff7b72from T7ee787datetime Tff7b72import Te6edf3datetime
Te6edf3now Tff7b72= Te6edf3datetimeTff7b72.Td2a8ffnowTb4b4b4(Tb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3timeTb4b4b4) Tff7b72is Tffa657intTb4b4b4:
Te6edf3diff Tff7b72= Te6edf3now Tff7b72- Te6edf3datetimeTff7b72.Td2a8fffromtimestampTb4b4b4(Te6edf3timeTb4b4b4)
Tff7b72elif Tffa657isinstanceTb4b4b4(Te6edf3timeTb4b4b4,Te6edf3datetimeTb4b4b4)Tb4b4b4:
Te6edf3diff Tff7b72= Te6edf3now Tff7b72- Te6edf3time
Tff7b72elif Tff7b72not Te6edf3timeTb4b4b4:
Te6edf3diff Tff7b72= Te6edf3now Tff7b72- Te6edf3now
Te6edf3second_diff Tff7b72= Te6edf3diffTff7b72.Td2a8ffseconds
Te6edf3day_diff Tff7b72= Te6edf3diffTff7b72.Td2a8ffdays
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff0Tb4b4b4:
Tff7b72return Ta5d6ff'Ta5d6ff'
Tff7b72if Te6edf3day_diff Tff7b72== T79c0ff0Tb4b4b4:
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff10Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3second_diffTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff secondsTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff60Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3second_diffTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff secondsTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff120Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff1 minuteTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff3600Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3second_diff Tff7b72/ T79c0ff60Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff minutesTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff7200Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ffan hourTa5d6ff"
Tff7b72if Te6edf3second_diff Tff7b72< T79c0ff86400Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3second_diff Tff7b72/ T79c0ff3600Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff hoursTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72== T79c0ff1Tb4b4b4:
Tff7b72return Ta5d6ff"Ta5d6ff1 dayTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff7Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Te6edf3day_diffTb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff daysTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff31Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3day_diff Tff7b72/ T79c0ff7Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff weeksTa5d6ff"
Tff7b72if Te6edf3day_diff Tff7b72< T79c0ff365Tb4b4b4:
Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3day_diff Tff7b72/ T79c0ff30Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff monthsTa5d6ff"
Tff7b72return Tffa657strTb4b4b4(Tffa657intTb4b4b4(Te6edf3day_diff Tff7b72/ T79c0ff365Tb4b4b4)Tb4b4b4) Tff7b72+ Ta5d6ff"Ta5d6ff yearsTa5d6ff"
Tff7b72if Tff7b72__name__ Tff7b72== Ta5d6ff"Ta5d6ff__main__Ta5d6ff"Tb4b4b4:
Te6edf3mainTb4b4b4(Tb4b4b4)
Served by rngit 1.5.1 - Generated in 0.12s